package br.uniceub.fsw.agenda.model.facade;

import br.uniceub.fsw.agenda.exception.BusinessException;
import br.uniceub.fsw.agenda.exception.DatabaseException;
import br.uniceub.fsw.agenda.model.dao.TipoLogradouroDAO;
import br.uniceub.fsw.agenda.model.vo.TipoLogradouroVO;
import br.uniceub.fsw.agenda.model.dao.MenuDAO;
import br.uniceub.fsw.agenda.model.vo.MenuVO;
import br.uniceub.fsw.agenda.util.StringUtils;
import java.util.List;

/**
 *
 * @author Bruno
 */
public class ManterTipoLogradouroFacade extends GenericFacade {

    /**
     * Busca todos os Menus
     * @return List com objetos Menu
     * @throws br.uniceub.fsw.agenda.exception.DatabaseException
     * @throws br.uniceub.fsw.agenda.exception.BusinessException
     */
    public List<MenuVO> findAllMenu() throws DatabaseException, BusinessException {
        try {
            MenuDAO dao = new MenuDAO(getConnection());
            return dao.findAll();
        } finally {
            closeConnection();
        }
    }

    /**
     * Busca todos os Tipos de Logradouro
     * @return List com objetos TipoLogradouro
     * @throws br.uniceub.fsw.agenda.exception.DatabaseException
     * @throws br.uniceub.fsw.agenda.exception.BusinessException
     */
    public List<TipoLogradouroVO> findAllTipoLogradouro() throws DatabaseException, BusinessException {
        try {
            TipoLogradouroDAO dao = new TipoLogradouroDAO(getConnection());
            return dao.findAll();
        } finally {
            closeConnection();
        }
    }

    /**
     * Busca todos os Tipos de Logradouro ou somente os logradouros com o nome passado
     * @param dsLogradouro descrição do logradouro
     * @return List com objetos TipoLogradouro
     * @throws br.uniceub.fsw.agenda.exception.DatabaseException
     * @throws br.uniceub.fsw.agenda.exception.BusinessException
     */
    public List<TipoLogradouroVO> findAllTipoLogradouro(String dsLogradouro) throws DatabaseException, BusinessException {
        try {
            TipoLogradouroDAO dao = new TipoLogradouroDAO(getConnection());
            
            if(StringUtils.isNullOrEmpty(dsLogradouro)) {
                dao.findAll();
            } else {
                dao.findAllByNome(dsLogradouro);
            }
            
            return dao.findAll();
        } finally {
            closeConnection();
        }
    }

    /**
     * Busca a TipoLogradouro pela id
     * @param idTipoLogradouro id do TipoLogradouro
     * @return objeto TipoLogradouro
     * @throws br.uniceub.fsw.agenda.exception.DatabaseException
     * @throws br.uniceub.fsw.agenda.exception.BusinessException
     */
    public TipoLogradouroVO findTipoLogradouroById(Integer idTipoLogradouro) throws DatabaseException, BusinessException {
        try {
            TipoLogradouroDAO dao = new TipoLogradouroDAO(getConnection());
            return dao.findById(idTipoLogradouro);
        } finally {
            closeConnection();
        }
    }
    
    /**
     * Busca todas as TipoLogradouros por parte do nome
     * @param dsTipoLogradouro nome do tipoLogradouro
     * @return List com objetos TipoLogradouro
     * @throws br.uniceub.fsw.agenda.exception.DatabaseException
     * @throws br.uniceub.fsw.agenda.exception.BusinessException
     */
    public List<TipoLogradouroVO> findAllTipoLogradouroByNome(String dsTipoLogradouro) throws DatabaseException, BusinessException {
        try {
            TipoLogradouroDAO dao = new TipoLogradouroDAO(getConnection());
            return dao.findAllByNome(dsTipoLogradouro);
        } finally {
            closeConnection();
        }
    }
    
    /**
     * Insere um novo tipoLogradouro.
     * @param tipoLogradouro
     * @return ID auto-increment gerada pra esse registro
     * @throws br.uniceub.fsw.agenda.exception.BusinessException 
     * @throws br.uniceub.fsw.agenda.exception.DatabaseException
     */
    public Integer inserirTipoLogradouro(TipoLogradouroVO tipoLogradouro) throws BusinessException, DatabaseException {
        try {
            TipoLogradouroDAO dao = new TipoLogradouroDAO(getConnection());

            String dsTipoLogradouro = tipoLogradouro.getDsTipoLogradouro();
            
            //tratamento de erros
            if(StringUtils.isNullOrEmpty(dsTipoLogradouro))
            {
                throw new BusinessException("Nome do TipoLogradouro é obrigatório.");
            }
        
            return dao.insert(tipoLogradouro);            
        } finally {
            closeConnection();
        }        
    }
    
    /**
     * Atualiza um tipoLogradouro.
     * @param tipoLogradouro
     * @throws br.uniceub.fsw.agenda.exception.BusinessException 
     * @throws br.uniceub.fsw.agenda.exception.DatabaseException
     */
    public void alterarTipoLogradouro(TipoLogradouroVO tipoLogradouro) throws BusinessException, DatabaseException {
        try {
            TipoLogradouroDAO dao = new TipoLogradouroDAO(getConnection());

            String dsTipoLogradouro = tipoLogradouro.getDsTipoLogradouro();
            
            //tratamento de erros
            if(StringUtils.isNullOrEmpty(dsTipoLogradouro))
            {
                throw new BusinessException("Nome do TipoLogradouro é obrigatório.");
            }
        
            dao.update(tipoLogradouro);            
        } finally {
            closeConnection();
        }        
    }
    
    /**
     * Exclui um tipoLogradouro.
     * @param tipoLogradouro
     * @throws br.uniceub.fsw.agenda.exception.BusinessException 
     * @throws br.uniceub.fsw.agenda.exception.DatabaseException
     */
    public void excluirTipoLogradouro(TipoLogradouroVO tipoLogradouro) throws BusinessException, DatabaseException {
        try {
            TipoLogradouroDAO dao = new TipoLogradouroDAO(getConnection());
            dao.delete(tipoLogradouro);
        } finally {
            closeConnection();
        }        
    }
    
}
